package com.cz.basetool.ui_work.util.bean;

import android.util.Log;

import com.cz.basetool.ui_work.util.log.AndroidConsoleLogPrinter;
import com.googlecode.openbeans.IntrospectionException;
import com.googlecode.openbeans.PropertyDescriptor;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by XinYi on 2019/4/29.
 */

public class CZBeanUtils {
    /**
     * javabean克隆
     * @param beanOrigin        原始bean
     * @return                   新bean
     */
    public static Object  cloneBean(Object beanOrigin){
        return cloneBean(beanOrigin,null);
    }

    /**
     * javabean克隆（带字段过滤）
     * @param beanOrigin        原始bean
     * @param exceptFields      不需要复制的字段
     * @return                   新bean
     */
    public static Object  cloneBean(Object beanOrigin,String[] exceptFields){
        Object newBean = null;
        try {
            newBean = beanOrigin.getClass().newInstance();

            Field[] fields = beanOrigin.getClass().getDeclaredFields();
            //遍历字段
            for(Field field : fields)
            {
                field.setAccessible(true);
                //获取字段的属性名
                String propertyName = field.getName();
                if(exceptFields != null && Arrays.asList(exceptFields).contains(propertyName)) continue;

                //得到属性描述器
                try {
                    //获取源Bean的get方法，得到属性。
                    PropertyDescriptor pdOrigin = new PropertyDescriptor(propertyName,beanOrigin.getClass());
                    //通过属性描述器得到字段对应的读取方法，获取得它的值并写入XML文档。
                    Method readMethod = pdOrigin.getReadMethod();
                    //调用方法获取属性值
                    //获取新Bean的set方法，设置属性。
                    PropertyDescriptor pdNew = new PropertyDescriptor(propertyName,beanOrigin.getClass());
                    //通过属性描述器得到字段对应的读取方法，获取得它的值并写入XML文档。
                    Method writeMethod = pdNew.getWriteMethod();
                    try {
                        Object beanOriginPropertyValue = readMethod.invoke(beanOrigin);
                        writeMethod.invoke(newBean,beanOriginPropertyValue);
                    } catch (Exception e) {
                        AndroidConsoleLogPrinter.e("TAG", "==CZBeanUtil出现异常==");
                        e.printStackTrace();
                    }
                } catch (IntrospectionException e) {
                    e.printStackTrace();
                }

            }

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return newBean;
    }

    /**
     * 获取Interface里所有的静态成员变量值
     * @param cls  要遍历的字节码
     * @return
     */
    public static List<Object> getAllPropertyValues(Class cls){
        List<Object> result = new ArrayList<>();
        Field[] fields = cls.getDeclaredFields();
        for(Field field : fields){
            field.setAccessible(true);
            try {
                Object object =  field.get(null);
                if(object != null){
                    result.add(object);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

}
